﻿using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Repositorios;
using Onshi.POS.Articulos.Vistas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Onshi.POS.Articulos
{
    public class DescuentosRecargosFechasHorasPresentador
    {
        #region Constructores

        public DescuentosRecargosFechasHorasPresentador(IDescuentosRecargosFechasHoras vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IDescuentosRecargosFechasHoras vista;
        private List<DescuentoRecargoFechaHora> listado;

        #endregion

        #region Propiedades

        private RepositorioEventos RepositorioEventos
        {
            get { return new RepositorioEventos(); }
        }

        private RepositorioDescuentosRecargosFechasHoras RepositorioDescuentosRecargosFechasHoras
        {
            get { return new RepositorioDescuentosRecargosFechasHoras(); }
        }

        private RepositorioUsuarios RepositorioUsuarios
        {
            get { return new RepositorioUsuarios(); }
        }

        private RepositorioRegistros RepositorioRegistros
        {
            get { return new RepositorioRegistros(); }
        }

        private RepositorioPermisos RepositorioPermisos
        {
            get { return new RepositorioPermisos(); }
        }

        private RepositorioArticulos RepositorioArticulos
        {
            get { return new RepositorioArticulos(); }
        }

        #endregion

        #region Metodos

        private void CargarFiltrarLista()
        {
            listado = RepositorioDescuentosRecargosFechasHoras.DevolverTodos();
            Filtrar();
        }

        public void Inicializar()
        {
            vista.ListadoDescuentosRecargosFechasHoras = listado = RepositorioDescuentosRecargosFechasHoras.DevolverTodos();
        }

        public void Eliminar()
        {
            var usuario = RepositorioUsuarios.DevolverPorId(vista.IdUsuarioSistema);
            if (usuario == null)
                throw new Exception("El usuario no existe");
            if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.DescuentosRecargosFechasHorasBaja))
                throw new Exception("Permisos insuficientes");

            if (vista.IdDescuentoRecargoFechaHora == (Int32)EnumDescuentosRecargosFechasHoras.SinDescuentoNiRecargo)
                throw new Exception("El descuento y recargo por fecha y hora no se permite eliminar");

            var descuentoRecargoFechaHora = RepositorioDescuentosRecargosFechasHoras.DevolverPorId(vista.IdDescuentoRecargoFechaHora);
            if (descuentoRecargoFechaHora == null)
                throw new Exception("El descuento y recargo por fecha y hora no existe");

            var descuentoRecargoFechaHoraPredeterminado = RepositorioDescuentosRecargosFechasHoras.DevolverPorId((Int32)EnumDescuentosRecargosFechasHoras.SinDescuentoNiRecargo);
            if (descuentoRecargoFechaHoraPredeterminado == null)
                throw new Exception("El descuento y recargo por fecha y hora predeterminado no existe");

            var registro = new Registro();
            registro.Usuario = usuario;
            registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.DescuentosRecargosFechasHorasBaja);
            if (registro.Evento == null)
                throw new Exception("El evento no existe");

            RepositorioArticulos.ModificarDescuentoRecargoFechaHora(descuentoRecargoFechaHoraPredeterminado, descuentoRecargoFechaHora);
            RepositorioDescuentosRecargosFechasHoras.Eliminar(descuentoRecargoFechaHora);
            RepositorioRegistros.Insertar(registro);

            CargarFiltrarLista();
        }

        public void Actualizar()
        {
            CargarFiltrarLista();
        }

        public void Filtrar()
        {
            var consulta = (from item in listado
                            where item.Nombre.Trim().ToLower().Contains(vista.NombreFiltro.Trim().ToLower())
                            & item.TieneObservaciones == (vista.ObservacionesFiltro == EnumSiNo.Todos ? item.TieneObservaciones : (vista.ObservacionesFiltro == EnumSiNo.Si ? true : false))
                            & (item.DescuentoRecargo >= vista.DescuentoRecargoDesdeFiltro & item.DescuentoRecargo <= vista.DescuentoRecargoHastaFiltro)
                            select item).ToList();
            vista.ListadoDescuentosRecargosFechasHoras = consulta;
        }

        public void Aceptar()
        {
            var usuario = RepositorioUsuarios.DevolverPorId(vista.IdUsuarioSistema);
            if (usuario == null)
                throw new Exception("El usuario no existe");
            if (vista.IdDescuentoRecargoFechaHora == 0)
            {
                if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.DescuentosRecargosFechasHorasAlta))
                    throw new Exception("Permisos insuficientes");
            }
            else if (!usuario.Perfil.Permisos.Exists(x => x.Id == (Byte)EnumPermisos.DescuentosRecargosFechasHorasModificacion))
                throw new Exception("Permisos insuficientes");

            if (String.IsNullOrWhiteSpace(vista.Nombre))
                throw new Exception("El nombre no puede quedar vacío");
            if (vista.FechaDesde > vista.FechaHasta)
                throw new Exception("La fecha desde no puede ser mayor a la fecha hasta");
            if (vista.HoraDesde > vista.HoraHasta)
                throw new Exception("La hora desde no puede ser mayor a la hora hasta");

            DescuentoRecargoFechaHora descuentoRecargoFechaHora;
            if (vista.IdDescuentoRecargoFechaHora != 0)
            {
                if (vista.IdDescuentoRecargoFechaHora == (Int32)EnumDescuentosRecargosFechasHoras.SinDescuentoNiRecargo)
                    throw new Exception("El descuento y recargo por fecha y hora no se permite modificar");
                descuentoRecargoFechaHora = RepositorioDescuentosRecargosFechasHoras.DevolverPorId(vista.IdDescuentoRecargoFechaHora);
                if (descuentoRecargoFechaHora == null)
                    throw new Exception("El descuento y recargo por fecha y hora no existe");
            }
            else
                descuentoRecargoFechaHora = new DescuentoRecargoFechaHora();

            descuentoRecargoFechaHora.Nombre = vista.Nombre.Trim();
            descuentoRecargoFechaHora.DescuentoRecargo = vista.DescuentoRecargo;
            descuentoRecargoFechaHora.Observaciones = vista.Observaciones.Trim();
            descuentoRecargoFechaHora.Lunes = vista.Lunes;
            descuentoRecargoFechaHora.Martes = vista.Martes;
            descuentoRecargoFechaHora.Miercoles = vista.Miercoles;
            descuentoRecargoFechaHora.Jueves = vista.Jueves;
            descuentoRecargoFechaHora.Viernes = vista.Viernes;
            descuentoRecargoFechaHora.Sabado = vista.Sabado;
            descuentoRecargoFechaHora.Domingo = vista.Domingo;
            descuentoRecargoFechaHora.FechaDesde = vista.FechaDesde;
            descuentoRecargoFechaHora.FechaHasta = vista.FechaHasta;
            descuentoRecargoFechaHora.HoraDesde = vista.HoraDesde;
            descuentoRecargoFechaHora.HoraHasta = vista.HoraHasta;

            var registro = new Registro();
            registro.Usuario = usuario;
            if (vista.IdDescuentoRecargoFechaHora == 0)
                registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.DescuentosRecargosFechasHorasAlta);
            else
                registro.Evento = RepositorioEventos.DevolverPorId((Byte)EnumEventos.DescuentosRecargosFechasHorasModificacion);
            if (registro.Evento == null)
                throw new Exception("El evento no existe");

            if (vista.IdDescuentoRecargoFechaHora == 0)
                RepositorioDescuentosRecargosFechasHoras.Insertar(descuentoRecargoFechaHora);
            else
                RepositorioDescuentosRecargosFechasHoras.Modificar(descuentoRecargoFechaHora);
            RepositorioRegistros.Insertar(registro);

            CargarFiltrarLista();
        }

        #endregion
    }
}
